package cn.anquing.pattern.prototypePattern;

/*
* 原型模式:不通过 new 关键字来产生一个对象，而是通过对象拷贝来实现的模式
* 一是类初始化需要消化非常多的资源，这个资源包括数据、硬件资源等；
* 二是通过 new 产生一个对象需要非常繁琐的数据准备或访问权限，则可以使用原型模式；
* 三是一个对象需要提供给其他对象访问，而且各个调用者可能都需要修改其值时，可以考虑使用原型模式拷贝多个对象供调用者使用。
* 在实际项目中，原型模式很少单独出现，一般是和工厂方法模式一起出现，通过 clone的方法创建一个对象，然后由工厂方法提供给调用者。
*/

import java.util.Random;

/**
 *
 * 可以这样理解一个对象的产生可以不由零开始，直接从一个已经具备一定雏形的对象克隆，然后再修改为一个生产需要的对象。
 */

public class Main {

    //发送账单的数量，这个值是从数据库中获得
    private static int MAX_COUNT = 6;

    public static void main(String[] args) {

        //模拟发送邮件
        int i=0;

        //把模板定义出来，这个是从数据库中获得
        Mail mail = new Mail(new AdvTemplate());

        mail.setTail("XX银行版权所有");

        while(i<MAX_COUNT) {

            //以下是每封邮件不同的地方
            mail.setAppellation(getRandString(5) + " 先生（女士） ");

            mail.setReceiver(getRandString(5) + "@" + getRandString(8) + ".com");
            //然后发送邮件
            sendMail(mail);
            i++;
        }
     }

    //发送邮件
    public static void sendMail(Mail mail){
        System.out.println("标题： "+mail.getSubject() + "\t收件人："+mail.getReceiver()+"\t....发送成功！ ");
    }

    //获得指定长度的随机字符串
    public static String getRandString(int maxLength){

        String source ="abcdefghijklmnopqrskuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuffer sb = new StringBuffer();
        Random rand = new Random();
        for(int i=0;i<maxLength;i++){
            sb.append(source.charAt(rand.nextInt(source.length())));
        }
        return sb.toString();
    }



}
